#_*_ coding:utf8 _*_
from DEF_SNMP_eNSP_Switch_S5700 import *
from DEF_SSH_eNSP_Switch_S5700 import *

import logging                                                              # 日志模块
Log = logging.getLogger('__name__')                                         # 获取实例
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')   # 指定logger输出格式
file_handler = logging.FileHandler('Main_Switch.log')                       # 日志文件路径
file_handler.setFormatter(formatter)                                        # 可以通过setFormatter指定输出格式
Log.addHandler(file_handler)                                                # 为logger添加的日志处理器
# 设置记录的日志级别
#Log.setLevel(logging.DEBUG)
Log.setLevel(logging.INFO)
#Log.setLevel(logging.WARNING)
#Log.setLevel(logging.ERROR)
#Log.setLevel(logging.CRITICAL)



## 测试 SNMP 功能

'''
## SNMP 功能由于 DEV_SNMP.py 是根据Linux写的，需要Linux环境

SNMP_PWD = 'pwd@123'
SNMP_HOST = '192.168.56.2'
SNMP_Ver = '2c'

## 查询设备IP和MAC绑定信息，生成字典形式
R = SNMP_生成以IP为键以MAC地址列表为值的字典(SNMP_PWD, SNMP_HOST)
if R[0] == 0:
    D_IP_MAC = R[1]
    INFO = '成功，IP和MAC绑定信息字典：' + str(D_IP_MAC)
    Log.info(INFO)
    print(INFO)
else:
    ERROR = '失败，错误信息：'+ R[1]
    Log.error(ERROR)
    print(ERROR)


## 查询设备VLAN接口的IP地址信息，生成字典形式
R = SNMP_生成以VLAN为键以VLAN_IP_MASK列表为值的字典(SNMP_PWD, SNMP_HOST)
if R[0] == 0:
    D_VLAN_NET = R[1]
    INFO = '成功，VLAN接口和IP信息字典：' + str(D_VLAN_NET)
    Log.info(INFO)
    print(INFO)
else:
    ERROR = '失败，错误信息：'+ R[1]
    Log.error(ERROR)
    print(ERROR)
'''




## 测试 SSH 功能

# 每台SSH设备的登录信息
D_DEV0 = {}
D_DEV0['SSH_USER'] = 'test'
D_DEV0['SSH_PASS'] = 'pwd@123'
D_DEV0['SSH_IP'] = '192.168.0.1'
D_DEV0['SSH_PORT'] = 2001

D_DEV1 = {}
D_DEV1['SSH_USER'] = 'test'
D_DEV1['SSH_PASS'] = 'pwd@123'
D_DEV1['SSH_IP'] = '192.168.1.1'

D_DEV2 = {}
D_DEV2['SSH_USER'] = 'test'
D_DEV2['SSH_PASS'] = 'pwd@123'
D_DEV2['SSH_IP'] = '192.168.56.2'


## 全部SSH设备组成列表（顺序无所谓）
L_DEVS = [D_DEV0, D_DEV1, D_DEV2]


## 制作选提示信息
设备列表 = '''
可以登录的设备列表
'''
for i in range(0, len(L_DEVS)):
    设备列表 += '[ '+ str(i) + ' ] 选择 ' + L_DEVS[i]['SSH_IP'] + ' 设备进行操作\n'
设备列表 += '[ q ] 退出选择设备\n请选择设备：'

#print(设备列表)
'''

可以登录的设备列表
[ 0 ] 选择 192.168.0.1 设备进行操作
[ 1 ] 选择 192.168.1.1 设备进行操作
[ 2 ] 选择 192.168.56.2 设备进行操作
[ q ] 退出选择设备

'''


## 制作业务功能选择列表
业务列表 = '''=== 功能菜单 ===
[ 0 ] 保存配置
[ 1 ] 查看全部IP和MAC绑定信息
[ 2 ] 绑定指定IP和指定MAC
[ 3 ] 在指定网段自动选择可用IP和指定MAC绑定
[ 4 ] 查找MAC地址所在网段
[ 5 ] 在MAC所在网段自动选择可用IP和进行绑定
[ 6 ] 解除指定IP和指定MAC的绑定
[ 7 ] 解除指定IP的全部MAC绑定
[ 8 ] 解除指定MAC的全部IP绑定
[ e ] 改变登录设备
[ q ] 退出功能程序
=== 功能菜单 ===

请输入功能编号：'''



## 循环交互操作
while 1:
    if '字典_登录信息' in locals().keys():
        print("【提示】当前已经缓存", 字典_登录信息['SSH_IP'], "登录信息")
        print()
    else:
        目标设备 = input(设备列表)
        INDEX = [str(i) for i in range(0, len(L_DEVS))]
        if 目标设备 in INDEX:
            字典_登录信息 = L_DEVS[int(目标设备)]
            print("【提示】当前已经选择", 字典_登录信息['SSH_IP'], "登录信息")
            print()
        elif 目标设备 == 'q':
            print("用户退出选择")
            break
        else:
            print("无效输入，请重新选择")
            print()
            while 1:
                目标设备 = input(设备列表)
                INDEX = [str(i) for i in range(0, len(L_DEVS))]
                if 目标设备 in INDEX:
                    字典_登录信息 = L_DEVS[int(目标设备)]
                    print("【提示】当前已经选择", 字典_登录信息['SSH_IP'], "登录信息")
                    print()
                elif 目标设备 == 'q':
                    print("用户退出选择")
                    break
            break

    业务选择 = input(业务列表)
    # 0 保存配置
    if 业务选择 == '0':
        T0 = time.time()
        print("正在执行 保存配置 请稍后")
        R = 保存配置(字典_登录信息)
        T1 = time.time()
        if R[0] == 0:
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            ERROR = R[1]
            Log.error(ERROR)
            print(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 1 查看全部IP和MAC绑定信息
    elif 业务选择 == '1':
        T0 = time.time()
        print("正在执行 查看全部IP和MAC绑定信息 请稍后")
        R = 获取IP和MAC绑定信息(字典_登录信息)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            D_IP_MAC = R[1]
            if D_IP_MAC == {}:
                print("当前无绑定记录")
            else:
                print("IP\t\t绑定MAC列表")
                for K in D_IP_MAC:
                    print(K, "\t", D_IP_MAC[K])
        else:
            print("失败")
            print("失败原因", R[1])
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 2 绑定指定IP和指定MAC
    elif 业务选择 == '2':
        Bind_IP  = input("输入要绑定的IP地址（如192.168.0.1)：")
        Bind_MAC = input("要绑定的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 绑定指定IP和指定MAC 请稍后")
        R = 绑定指定IP和指定MAC(字典_登录信息, Bind_IP, Bind_MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 3在指定网段自动选择可用IP和指定MAC绑定
    elif 业务选择 == '3':
        Bind_NET  = input("要绑定的网段（如192.168.0.1/24 或 192.168.0.1/255.255.255.0： ")
        Bind_MAC = input("要绑定的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 在指定网段自动选择可用IP和指定MAC绑定 请稍后")
        R = 在指定网段自动选择可用IP和指定MAC绑定(字典_登录信息, Bind_NET, Bind_MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 4 查找MAC地址所在网段
    elif 业务选择 == '4':
        MAC = input("要查找的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 查找MAC地址所在网段 请稍后")
        R = 查找MAC地址所在网段(字典_登录信息, MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 5 在MAC所在网段自动选择可用IP和进行绑定
    elif 业务选择 == '5':
        Bind_MAC = input("要绑定的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 在MAC所在网段自动选择可用IP和进行绑定 请稍后")
        R = 在MAC所在网段自动选择可用IP和进行绑定(字典_登录信息, Bind_MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 6 解除指定IP和指定MAC的绑定
    elif 业务选择 == '6':
        Undo_Bind_IP  = input("要解除绑定的IP地址（如192.168.0.1)：")
        Undo_Bind_MAC = input("要解除绑定的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 解除指定IP和指定MAC的绑定 请稍后")
        R = 解除指定IP和指定MAC的绑定(字典_登录信息, Undo_Bind_IP, Undo_Bind_MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 7 解除指定IP的全部MAC绑定
    elif 业务选择 == '7':
        Undo_Bind_IP  = input("要解除绑定的IP地址（如192.168.0.1)：")
        T0 = time.time()
        print("正在执行 解除指定IP的全部MAC绑定 请稍后")
        R = 解除指定IP的全部MAC绑定(字典_登录信息, Undo_Bind_IP)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    # 8 解除指定MAC的全部IP绑定
    elif 业务选择 == '8':
        Undo_Bind_MAC = input("要解除绑定的MAC地址（任意mac地址写法）：")
        T0 = time.time()
        print("正在执行 解除指定MAC的全部IP绑定 请稍后")
        R = 解除指定MAC的全部IP绑定(字典_登录信息, Undo_Bind_MAC)
        T1 = time.time()
        if R[0] == 0:
            print("成功")
            print("成功信息", R[1])
            INFO = R[1]
            Log.info(INFO)
            print(INFO)
        else:
            print("失败")
            print("失败原因", R[1])
            ERROR = R[1]
            Log.error(ERROR)
        print("耗时 %.1f 秒" % (T1-T0))
        print()
    elif 业务选择 == 'e':
        print()
        print("【提示】修改登录设备")
        while 1:
            目标设备 = input(设备列表)
            INDEX = [str(i) for i in range(0, len(L_DEVS))]
            if 目标设备 in INDEX:
                字典_登录信息 = L_DEVS[int(目标设备)]
                print("【提示】当前重新选择", 字典_登录信息['SSH_IP'], "登录信息")
                print()
                break
            elif 目标设备 == 'q':
                print("用户退出选择")
                break
            else:
                print("无效输入，请重新选择")
    elif 业务选择 == 'q':
        print("用户正常退出程序")
        break
    else:
        print("无效选择，重新选择")
